#ifndef DATABASECLASS_H
#define DATABASECLASS_H

#include <QObject>
#include <QHash>
#include <QPixmap>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QTimer>
#include <QDate>
#include "chatbuf.h"
#include "chathistroy.h"
#include "friendlistlib.h"
#include "UserLayer/GUI/MyFavoritesWidget/favoritelib.h"
#include "AbstractLayer/Database/contactlib.h"
#include "AbstractLayer/Database/friendlistlib.h"
#include "UserLayer/External/enumlib.h"
#include "AbstractLayer/Database/friendapplylib.h"
class DatabaseClass : public QObject
{
public:
    Q_OBJECT
public:
    explicit DatabaseClass(QObject *parent = nullptr);
    QTimer* timer;
signals:

    //加载好友列表完毕
    void s_loadContactDone(QList<QPair<QString,QString>>);
    //加载消息列表完毕
    void s_loadFriendDone(QList<QPair<QPair<QString,QString>,QString>>);
    //加载上一页完毕
    void s_loadLastPageDone(QList<QPair<bool,QString>>);
    //
    void s_loadFavoriteDone(QList<QPair<QPair<QString,QString>,QString>>);
    //有新消息传递给ui界面，以刷新
    void s_haveNewMessage(QPair<QString,QString>);

    void s_isWorking(bool);

    void s_nameChange(QString filename,QString filepath);

    void s_creatDirDone();

    void s_loadFriendApplyDone(const QList<QPair<QPair<QString,QString>,uint8_t>>&);

public slots:
    void setUseroc(const QString& useroc);
    //初始化数据库
    void initDatabase();
    //加载上一页记录
    void loadLastPage();
    //加载消息列表
    void loadFriendList();
    //加载联系人列表
    void loadContactList();
    //
    void loadFavoriteList();
    //创建聊天记录的表格，表名应为OC号
    void createChatTable(const QString& friendoc);
    //设置聊天记录的oc
    void setHistroyOC(QString oc);
    //向聊天缓存中添加一项记录
    void addChat(QString meetingoc,QString content,bool sender);
    //写入到数据库
    void writeIntoDB(QList<QPair<QPair<QString,QString>,bool>>);
    //重置区间
    void reset();
    //重置定时器
    void resetTimer();
    //处理接收的信息
    void dealRcvContent(QPair<QString,QString>);
    //刷新数据库中好友列表最新消息，应在关闭事件中调用
    void refreshLastest(QSet<QString>);
    //删除好友
    void deleteContact(QString);

    //添加收藏
    void addFavorite(QString,QString,QString);
    //移除收藏
    void removeFavoriteDB(QString filename);
    //添加好友申请
    void addFriendApply(const QString friendoc,const QString friendname,const EnumLib::ApplyStatus status);
    //更新用户信息
    void updataUserInfo(QString oldoc,QString oc,QString name);
    //清楚缓冲区
    void clearLib();

    //创建用户数据库并创建文件夹
    void createNewDB(QString username);

    void createContactListTable(QSqlQuery& query);
    void createFriendListTable(QSqlQuery& query,QString oc,QString name);
    void createFavoriteListTable(QSqlQuery& query);
    void createFriendApplyTable(QSqlQuery& query);


    void addToFriendList(const QString& oc,const QString& name,const QString& lastest="");

    void deleteDatabase();

    void writeContactIntoDB(const QList<QPair<QString,QString>>&);

    void addContact(const QString friendoc,const QString& friendname);

    void removeFriendOne(const QString& oc);

    void removeFriendList(const QStringList& oclist);

    void upDataFriendApplyStatus(const QString friendoc,const EnumLib::ApplyStatus newstatus);

    void upDataFriendApply(const QString friendoc,const QString& friendname,const EnumLib::ApplyStatus newstatus);

    void loadFriendApplyList();

    void dropChatHistroyTable(const QString& oc);

    void hideChat(const QString& friendoc);

    void deleteChat(const QString& friendoc);

    //优化措施，移除记录，重新加载信息列表
    void deleteFriendRowAndLoad(const QString& friendoc);
    //优化措施，移除记录，删除记录表，重新加载信息列表
    void deleteDropFriendAndLoad(const QString& friendoc);

    void getFriendLastest(const QString& friendoc);
private:
    QSqlQuery query;
    int top;
    int buttom;
    QString useroc;
    bool ischange;
};

#endif // DATABASECLASS_H
